포스트

11. 의존관계 자동 주입

11. 의존관계 자동 주입

의존관계 자동 주입

의존관계 주입 방법에는 4가지가 있다.

  • 생성자 주입
  • 수정자 주입 (setter 주입)
  • 필드 주입
  • 일반 메서드 주입

생성자 주입

  • 생성자를 통해 의존 관계 주입
  • 특징
    • 최초 1회만 주입 받는다.
    • 불변, 필수 의존관계에 사용
1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}
  • 여기서는 할인 정책과 멤버 기록을 함부러 바꿀 일이 없기에 불변으로 설정해 프로그램의 안전성을 보장한다.
  • 단 생성자가 딱 한개면 @Autowired 지정을 생략 할 수 있다.
    • 단 생성자가 여러개면 어떤 생성자로 Bean 등록을 해야할지 모르기에 @Autowired 를 많이 사용한다.

수정자 주입

  • setter 주입이라고도 한다.
  • 수정 할 때 주로 사용
1
2
3
4
5
6
7
8
9
10
@Component
public class OrderServiceImpl implements OrderService{

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
		
		@Autowired
		public void setMemberRepository(MemberRepository memberRepository)(
			this.memberRepository =  memberRepository;
}
  • setter 를 통해 자동으로 주입을 한다.
  • 단 생성자가 있다면 우선적으로 생성자 부터 등록되고 setter가 실행된다.

참고 : @Autowired 는 기본 동작은 주입 대상이 없으면 오류 @Autowired(required = false) 를 통해 주입 대상 없이 동작이 가능하다.

필드 주입

  • 이름 그대로 필드에 바로 주입
  • 특징
    • 코드가 간결하긴하다.
    • DI 프레임워크가 없으면 아무것도 할 수 없다.
    • 외부에서 테스트하기가 너무 힘들다.
  • 어디서 사용할까?
    • 테스트 코드
1
2
3
4
5
6
7
@Component
public class OrderServiceImpl implements OrderService{
		@Autowired
    private MemberRepository memberRepository;
    @Autowired
    private DiscountPolicy discountPolicy;
}

일반 메서드 주입

  • 일반 메서드를 통해 주입
  • 특징
    • 여러 메서드를 동시에 주입 가능
    • 일반적으로 자주 사용되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class OrderServiceImpl implements OrderService{

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

옵션 처리

  • 주입할 스프링 빈이 없어도 동작해야할 때가 있다.

자동 주입 대상을 옵션으로 처리

  • @Aurowired(required=false) : 자동 주입 대상이 없으면 수정자
  • org.springframework.lang.@Nullable : 자동 주입대상 없으면 null 입력
  • Optional 활용

이러한 방법은 스프링 전반에 걸쳐 지원되며 생성사 자동 주입에서 특정 필드에 있어 사용될 수도 있다.

그렇다면 우리는 어떤 주입을 선택해야할까?


생성자 주입이 좋은 이유

불변

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존 관계를 변경 할 일이 없다.
  • 대부분의 의존관계는 종료전까지 변하면 안된다.
  • 누군가 실수로 의존관계를 변경 할 수도 있다. → 메서드는 함부로 열지 않는다.
  • 충분히 불변하게 설계가 가능하다.
    • 객체의 final을 사용하도록 해서 실수를 방어하자
    • 컴파일 오류로 버그를 방지한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

© 김규형. 일부 권리 보유

Powered by Jekyll with Chirpy theme